﻿#define _CRT_SECURE_NO_WARNINGS
#pragma once

#include <locale.h>
#include <stdlib.h>
#include <windows.h>
#include <stdbool.h>
#include <stdio.h>
#include <time.h>

#define WALL L'□'//墙
#define BODY L'●'//蛇身
#define FOOD L'★'//食物

//蛇的初始化位置
#define POS_X 24
#define POS_Y 5

//用KEY_PRESS检测VK这个虚拟按键对应的按键是否被按过
//按过返回1没有按过返回0
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x01) ? 1 : 0 )


//游戏欢迎界面
void WelComeToGame();

//蛇的节点
typedef struct SnakeNode
{
	//坐标
	int x;
	int y;
	struct SnakeNode* next;

}SnakeNode,* pSnakeNode;

//蛇的方向
enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};

//游戏状态
enum GAME_STATUS
{
	OK,//正常运行
	END_NORMAL,//按ESC退出
	KILL_BY_WALL,  //撞墙
	KILL_BY_SELF  //咬到自己
};



//蛇的结构
typedef struct Snake
{
	pSnakeNode _pSnake; //指向贪吃蛇头节点的指针
	pSnakeNode _pFood; //指向食物节点的指针
	int _Score; //贪吃蛇累计的总分
	int _FoodWeight; //一个食物的分数
	int _SleepTime; //每走一步休息的时间，时间越短速度越快
	enum DIRECTION _Dir;//用枚举列出蛇的方向
	enum GAME_STATUS _Status; //游戏的状态   ：正常 退出 撞墙 吃到自己
}Snake,*pSnake;

//游戏的开始  -游戏的初始化
void GameStart(pSnake ps);

//光标定位
void SetPos(short x, short y);

//游戏开始的欢迎界面
void WelComeToGame();

//打印地图
void CreateMap();

//初始化贪吃蛇
void InitSnake(pSnake ps);

//创建食物
void CameRun(pSnake ps);

//游戏开始
void GameRun(pSnake ps);

//打印提示信息
void PrintHelpInfo();

//游戏的暂停和恢复
void Pause();

//蛇的移动
void SnakeMove(pSnake ps);

//判断蛇头到达的坐标处是否是食物
int NextIsFoof(pSnake ps, pSnakeNode pnext);

//吃掉食物
void EatFood(pSnake ps, pSnakeNode pnext);

//不吃食物
void NoFood(pSnake ps, pSnakeNode pnext);

//蛇是否撞墙
void KillByWall(pSnake ps);

//蛇是否吃到自己
void KillBySelf(pSnake ps);

//游戏结束后的善后处理
void GamaeEnd(pSnake ps);



